package 极客算法训练营.chapter04;

/**
 * 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图，计算按此排列的柱子，下雨之后能接多少雨水。
 */
public class 接雨水 {
    public static void main(String[] args) {

    }

    public int trap(int[] height) {
        if (height == null || height.length == 0) return 0;
        int size = height.length;
        int[] left_max = new int[size];
        int[] right_max = new int[size];
        int result = 0;
        left_max[0] = height[0];
        right_max[size - 1] = height[size - 1];
        //向左看的最大值
        for (int i = 1; i < size; i++) {
            left_max[i] = Math.max(height[i], left_max[i - 1]);
        }
        //向右看的最大值
        for (int j = size - 2; j >= 0; j--) {
            right_max[j] = Math.max(height[j], right_max[j + 1]);
        }
        //遍历
        for (int k = 0; k < size; k++) {
            //左右最大值的较小者与当前高的差值
            result += Math.min(left_max[k], right_max[k]) - height[k];
        }
        return result;
    }
}
